home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / UUPC11QS.ARJ / EXPORT.C < prev    next >
C/C++ Source or Header  |  1991-11-06  |  6KB  |  155 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    e x p o r t . c                                                 */
  3. /*                                                                    */
  4. /*    File name mapping routines for UUPC/extended                    */
  5. /*--------------------------------------------------------------------*/
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <time.h>
  12.  
  13. #include "lib.h"
  14. #include "arbmath.h"
  15. #include "export.h"
  16. #include "import.h"
  17. #include "usertabl.h"
  18. #include "hostable.h"
  19. #include "security.h"
  20.  
  21. currentfile();
  22.  
  23. void exportpath(char *canon, const char *host, char const *remote)
  24. {
  25.    const char *xhost;
  26.    char *copy;
  27.    char tempname[FILENAME_MAX];
  28.    size_t subscript;
  29.    unsigned char number[MAX_DIGITS];
  30.    char *token, *out;
  31.  
  32.    static size_t range =  UNIX_END_C - UNIX_START_C + 1;
  33.                               /* Determine unique number characters in
  34.                                  the UNIX file names we are mapping  */
  35.    size_t charsetsize;
  36.             /* Number of allowed characters in
  37.                               MS-DOS file names                   */
  38.  
  39. /*--------------------------------------------------------------------*/
  40. /*                      Define our character set                      */
  41. /*--------------------------------------------------------------------*/
  42.  
  43.    if ( E_charset == NULL )
  44.       E_charset = DOSCHARS;
  45.  
  46.    charsetsize = strlen( E_charset );
  47.  
  48. /*--------------------------------------------------------------------*/
  49. /*                Drop leading spool directory, if any                */
  50. /*--------------------------------------------------------------------*/
  51.  
  52.    if (equalni(host, spooldir, strlen( spooldir )))
  53.       xhost = host + strlen( spooldir ) + 1;
  54.    else
  55.       xhost = host;
  56.  
  57.    copy = strdup( xhost );
  58.    checkref( copy );
  59.  
  60. /*--------------------------------------------------------------------*/
  61. /*                        Drop the remote name                        */
  62. /*--------------------------------------------------------------------*/
  63.  
  64.    token = strtok( copy, "/");
  65.  
  66.    if ((token == NULL) || !equaln( token, remote, strlen( token )))
  67.    {
  68.       printmsg(0,"exportpath: Badly formed host name \"%s\"",xhost);
  69.       panic();
  70.    }
  71.  
  72. /*--------------------------------------------------------------------*/
  73. /*                 Get the character leading the name                 */
  74. /*--------------------------------------------------------------------*/
  75.  
  76.    token = strtok( NULL, "/");
  77.    if ( (token == NULL) || (strlen(token) != 1))
  78.    {
  79.       printmsg(0,"exportpath: Badly formed host name \"%s\"",xhost);
  80.       panic();
  81.    }
  82.  
  83.    strcpy(canon, token);
  84.    strcat(canon, ".");
  85.  
  86. /*--------------------------------------------------------------------*/
  87. /*       Create a binary number which represents our file name        */
  88. /*--------------------------------------------------------------------*/
  89.  
  90.    for (subscript = 0; subscript < MAX_DIGITS; subscript++ )
  91.       number[subscript] = 0;  /* Initialize number to zero        */
  92.  
  93.    token = strtok( NULL, "/");   /* Get variable part of name        */
  94.    while( (*token != '\0') && (*number == '\0'))
  95.    {
  96.       unsigned char digit;
  97.       mult(number, charsetsize, MAX_DIGITS); /* Shift the number over   */
  98.       digit = (unsigned char) (strchr( E_charset , *token++) - E_charset);
  99.       add(number, digit , MAX_DIGITS); /* Add in new low order       */
  100.       if (*token == '.')               /* Next character a period?   */
  101.          token ++;                     /* Yes --> Ignore it          */
  102.    } /* while */
  103.  
  104.    out = &tempname[FILENAME_MAX];
  105.    *--out = '\0';          /* Terminate the string we will build  */
  106.  
  107. /*--------------------------------------------------------------------*/
  108. /*         Here's the loop to actually do the base conversion         */
  109. /*--------------------------------------------------------------------*/
  110.  
  111.       while(adiv( number, range, &subscript, MAX_DIGITS))
  112.        *--out = (char) (subscript + UNIX_START_C);
  113.  
  114. /*--------------------------------------------------------------------*/
  115. /*    We sort of lied above; the first character out of the           */
  116. /*    conversion is not a character at all, but bits which say how    */
  117. /*    many characters the remote and local file names get prefixed    */
  118. /*    to the converted name.  Retrieve that information now           */
  119. /*--------------------------------------------------------------------*/
  120.  
  121.       subscript = *out - UNIX_START_C;
  122.                               /* Convert back to pure number         */
  123.       token = canon + strlen( canon ); /* Remember end of string     */
  124.       if (subscript > HOSTLEN)
  125.       {
  126.          subscript /= HOSTLEN;
  127.          strcat( canon, remote );
  128.       }
  129.       else
  130.          strcat( canon, nodename );
  131.       token[ subscript ] = '\0';    /* Only use the length we were told */
  132.  
  133. /*--------------------------------------------------------------------*/
  134. /*               Add in the variable name and we're done              */
  135. /*--------------------------------------------------------------------*/
  136.  
  137.       strcat( canon, ++out );
  138.       free( copy );
  139.  
  140. /*--------------------------------------------------------------------*/
  141. /*                          Check the result                          */
  142. /*--------------------------------------------------------------------*/
  143.  
  144.       importpath( tempname, canon, remote );
  145.       if ( !equal( tempname, xhost ))
  146.       {
  147.          printmsg(0,
  148.             "exportpath: input \"%s\", result \"%s\", import \"%s\"",
  149.             xhost, canon, tempname );
  150.          panic();
  151.       } /* if */
  152.  
  153.  
  154. } /* exportpath */
  155.